package com.guli.secKill.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/*
 * @Author 罗俊
 * @date 2020/11/30 - 11:29 上午
 *
 */
@Component
@Slf4j
public class HelloScheduled {

    /**
     * 周的位置，是几就是星期几（星期一就是1）
     * 定时任务不应该阻塞，当前定时任务被阻塞，则下一个定时任务也会被当前任务所阻塞
     * 解决方法：
     * 1、开线程去执行任务，可以让业务以异步的方式，自己提交到线程池
     * 2、使用定时任务线程池，设置 TaskSchedulingAutoConfiguration 的 TaskSchedulingProperties 来进行配置线程池的大小（不好用，有bug）
     * 3、让定时任务异步执行，给希望异步执行的方法上标注@Async，
     */

//    @Scheduled(cron = "* * * ? * 1")
    public void sayHello() {

        CompletableFuture.runAsync(() -> {
            // 要执行的任务
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        log.info("你好（使用异步任务的方式）");
    }


    @Async
//    @Scheduled(cron = "0 * * ? * 1")
    public void sayNihao() {
        // 要执行的任务
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("你好（使用 TaskScheduling 的方式）");
    }
}
